home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CreatingGames / Utilities / Misc / ModemLink / Examples / DeviceStuff.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-06  |  2.7 KB  |  128 lines

  1. #include "DeviceStuff.h"
  2.  
  3. #include <exec/types.h>
  4. #include <exec/io.h>
  5. #include <exec/ports.h>
  6. #include <devices/serial.h>
  7. #include <devices/timer.h>
  8.  
  9. #include <proto/exec.h>
  10.  
  11. #include <stdio.h>
  12.  
  13. int OpenTimerDevice(struct MsgPort **TimerMP, struct timerequest **TimerIO)
  14. {
  15.   if (*TimerMP = CreateMsgPort()) {
  16.     if (*TimerIO = CreateIORequest(*TimerMP, sizeof(struct timerequest))) {
  17.       if (!OpenDevice(TIMERNAME, UNIT_VBLANK, (struct IORequest *)*TimerIO, 0))
  18.         return(1);
  19.       DeleteIORequest((struct IORequest *) *TimerIO);
  20.     }
  21.     DeleteMsgPort(*TimerMP);
  22.   }
  23.  
  24.   return(0);
  25. }
  26.  
  27. int OpenSerialDevice(struct MsgPort **SerMP, struct IOExtSer **SerIO, char *SerName, LONG Unit)
  28. {
  29.   ULONG err;
  30.  
  31.   if (*SerMP = CreateMsgPort()) {
  32.     if (*SerIO = CreateIORequest(*SerMP, sizeof(struct IOExtSer))) {
  33.       (*SerIO)->io_SerFlags = SERF_SHARED;
  34.       err = OpenDevice(SerName, Unit, (struct IORequest *)*SerIO, 0L);
  35.       if (!err)
  36.         return(1);
  37.       DeleteIORequest((struct IORequest *) *SerIO);
  38.     }
  39.     DeleteMsgPort(*SerMP);
  40.   }
  41.  
  42.   return(0);
  43. }
  44.  
  45. int TimedIO(struct IORequest *IOReq, int TimeOut)
  46. {
  47.   struct timerequest *TimerIO = NULL;
  48.   struct MsgPort *TimerMP = NULL;
  49.   ULONG IOBit, TimerBit;
  50.   int ReturnCode = NULL;
  51.  
  52.   if (IOReq && OpenTimerDevice(&TimerMP, &TimerIO)) {
  53.     IOBit = 1 << IOReq->io_Message.mn_ReplyPort->mp_SigBit;
  54.     TimerBit = 1 << TimerMP->mp_SigBit;
  55.  
  56.     TimerIO->tr_node.io_Command = TR_ADDREQUEST;
  57.     TimerIO->tr_time.tv_secs = TimeOut;
  58.     TimerIO->tr_time.tv_micro = 0;
  59.  
  60.     SendIO((struct IORequest *) TimerIO);
  61.     SendIO(IOReq);
  62.  
  63.     for (;;) {
  64.       Wait(IOBit | TimerBit);
  65.  
  66.       if (CheckIO(IOReq)) {
  67.         ReturnCode = 1;
  68.         break;
  69.       }
  70.  
  71.       if (CheckIO((struct IORequest *)TimerIO))
  72.         break;
  73.     }
  74.     DoAbortIO(IOReq);
  75.     DoAbortIO((struct IORequest *)TimerIO);
  76.  
  77.     SafeCloseDevice(TimerMP, (struct IORequest *)TimerIO);
  78.   }
  79.  
  80.   return(ReturnCode);
  81. }
  82.  
  83. void DoAbortIO(struct IORequest *IO)
  84. {
  85.   if (CheckIO(IO) == 0)
  86.     AbortIO(IO);
  87.   WaitIO(IO);
  88. }
  89.  
  90. void SafeCloseDevice(struct MsgPort *MP, struct IORequest *IO)
  91. {
  92.   if (IO) {
  93.     CloseDevice(IO);
  94.     DeleteIORequest(IO);
  95.   }
  96.  
  97.   if (MP)
  98.     DeleteMsgPort(MP);
  99. }
  100.  
  101. int CloneIO(struct IORequest *IO, struct MsgPort **NewMP, struct IORequest **NewIO)
  102. {
  103.   if (IO && NewMP && NewIO) {
  104.     if (*NewMP = CreateMsgPort()) {
  105.       if (*NewIO = CreateIORequest(*NewMP, IO->io_Message.mn_Length)) {
  106.         CopyMem(IO, *NewIO, IO->io_Message.mn_Length);
  107.         (*NewIO)->io_Message.mn_ReplyPort = *NewMP;
  108.         return(1);
  109.       }
  110.       DeleteMsgPort(*NewMP);
  111.     }
  112.   }
  113.  
  114.   *NewMP = NULL;
  115.   *NewIO = NULL;
  116.  
  117.   return(0);
  118. }
  119.  
  120. void DeleteIO_MP(struct MsgPort *MP, struct IORequest *IO)
  121. {
  122.   if (IO)
  123.     DeleteIORequest(IO);
  124.  
  125.   if (MP)
  126.     DeleteMsgPort(MP);
  127. }
  128.